//
//  LREmoticonController.swift
//  01 表情键盘
//
//  Created by 雷路荣 on 15/12/28.
//  Copyright © 2015年 leilurong. All rights reserved.
//

import UIKit

class LREmoticonController: UIViewController {

    // MARK: - 属性
    /// cell的重用标识
    private let reuseIdentifier = "reuseIdentifier"
    
    /// 表情包模型
    private let packages = LREmoticonPackge.loadPackges()
    
    /// 表情要添加到的textView,控制器没有必要强引用
    weak var textView: UITextView?
    /// 按钮起始tag
    var baseTag = 1000
    /// 选中按钮
    var selectedButton: UIButton?
    /// 构造方法需要传入textView
    init(textView: UITextView) {
        self.textView = textView
        super.init(nibName: nil, bundle: nil)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        prepareUI()
    }
    ///MARK: - 准备控件
    func prepareUI() {
        //添加控件
        view.addSubview(collectionView)
        view.addSubview(toolBar)
        //添加约束,表情键盘给其他工程使用,尽可能少的依赖第三方框架
        collectionView.translatesAutoresizingMaskIntoConstraints = false
        toolBar.translatesAutoresizingMaskIntoConstraints = false
        
        // 使用VFL collectionView水平填充父控件
        // format: VFL语句 H: 表示水平 |父控件左边 | 父控件的右边 [] 有一个view [ view的左边 ]view的右边
        // 返回的是约束的数组
        view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-0-[cv]-0-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["cv": collectionView]))
        // toolBar水平填充父控件
        view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-0-[tb]-0-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["tb": toolBar]))
        // 垂直方向
        // 1.collectionView的顶部和父控件的顶部重合
        // 2.collectionView的底部和toolBar的顶部重合
        // 3.toolBar高44
        // 4.toolBar底部和父控件的底部重合
        view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-0-[cv]-0-[tb(44)]-0-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["cv": collectionView, "tb": toolBar]))
        
        // 设置toolBar
        setupToolBar()
        
        // 设置collectionView
        setupCollectionView()
    }
    
    
    /// 设置toolBar
    private func setupToolBar() {
        //创建空数组
        var items = [UIBarButtonItem]()
        var index = 0
        for package in packages! {
            // 创建按钮.按钮的文字可以选中和高亮
            let button = UIButton()
            //print("package.group_name_cn = \(package.group_name_cn)")
            button.setTitle(package.group_name_cn, forState: UIControlState.Normal)
            button.setTitleColor(UIColor.lightGrayColor(), forState: UIControlState.Normal)
            button.setTitleColor(UIColor.darkGrayColor(), forState: UIControlState.Highlighted)
            button.setTitleColor(UIColor.darkGrayColor(), forState: UIControlState.Selected)
            button.sizeToFit()
            //绑定事件
            button.addTarget(self, action: "buttonClick:", forControlEvents: UIControlEvents.TouchUpInside)
            // tag加上起始baseTag从1000开始,每一个view默认是0，加一个baseTag防止重叠，后面取错
            button.tag = index + baseTag
            
            // 判断如果是最近按钮,选中最近按钮
            if index == 0 {
                switchSelectedButton(button)
            }
            //创建item指定自定义控件为button
            let item = UIBarButtonItem(customView: button)
            //添加到数组
            items.append(item)
            //添加弹簧隔开按钮
            items.append(UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: nil, action: nil))
            
            index++
        }
        // 移除最后一条弹簧
        items.removeLast()
        // 设置toolBar的items
        toolBar.items = items
    }
    //工具栏按钮点击
    func buttonClick(button: UIButton) {
        //print("点击了第\(button.tag - baseTag)组")
        // 滚动到对应的表情包
        collectionView.scrollToItemAtIndexPath(NSIndexPath(forItem: 0, inSection: button.tag - baseTag), atScrollPosition: UICollectionViewScrollPosition.Left, animated: true)
        //切换选中按钮
        switchSelectedButton(button)
    }
    //点击切换选中按钮
    func switchSelectedButton(button: UIButton){
        self.selectedButton?.selected = false
        button.selected = true
        self.selectedButton = button
    }
    
    /// 设置collectionView
    private func setupCollectionView() {
        //注册cell
        collectionView.registerClass(LREmoticonCell.self, forCellWithReuseIdentifier: reuseIdentifier)
        //设置数据源方法
        collectionView.dataSource = self
        collectionView.delegate = self
    }
    
    // MARK: - 懒加载
    /// collectionView,直接创建布局赋值
    private lazy var collectionView: UICollectionView = UICollectionView(frame: CGRectZero, collectionViewLayout: LRCollectionViewFlowLayout())
    /// toolBar
    private lazy var toolBar: UIToolbar = UIToolbar()
}
//MARK: - 自定义流水布局------------------------------------------------------
// 继承系统的流水布局 UICollectionViewFlowLayout, 来覆盖prepareLayout来设置layout的参数
class LRCollectionViewFlowLayout: UICollectionViewFlowLayout {
    // 覆盖父类的方法
    override func prepareLayout() {
        super.prepareLayout()
        //设置cell大小
        self.itemSize = CGSizeMake((collectionView?.bounds.width)! / 7, (collectionView?.bounds.height)! / 3)
        //设置间距0
        self.minimumInteritemSpacing = 0
        self.minimumLineSpacing = 0
        //滚动方向 水平
        self.scrollDirection = UICollectionViewScrollDirection.Horizontal
        
        collectionView?.pagingEnabled = true
        collectionView?.bounces = false
        collectionView?.showsHorizontalScrollIndicator = false
    }
}
// MARK: - 扩展 CZEmoticonViewController 实现 UICollectionViewDataSource,UICollectionViewDelegate
extension LREmoticonController: UICollectionViewDataSource ,UICollectionViewDelegate {
    //返回组
    func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
        return packages?.count ?? 0
    }
    //返回每组cell个数
    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        let package = packages![section]
        return package.emoticons.count
    }
    //返回每个cell
    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! LREmoticonCell
        //cell.backgroundColor = UIColor.randomColor()
        // cell显示表情需要设置表情模型
        // 获取表情包
        let package = packages![indexPath.section]
        cell.emoticon = package.emoticons[indexPath.item]
        return cell
    }
    // collectionView停止滚动调用
    func scrollViewDidEndDecelerating(scrollView: UIScrollView) {
        // 1.获取collectionView正在显示的cell的indexPath
        // 因为cell的frame是小数,实际显示个数不是21个是24个,要获取当前显示哪一组,拿的indexPath不要拿最前面3个(1列)和最后面3个(1列)
        let indexPath = collectionView.indexPathsForVisibleItems()[10]
        // 2.可以知道显示的是哪个section
        let showSection = indexPath.section
        // 3.找到对应的按钮
        // viewWithTag: 通过view的tag来找到对应的view.谁来调用就先找谁,没找到就用他的子控件
        // "最近"这个按钮的tag是0,view默认的tag是0,会先找到toolBar,所以按钮的tag不要从0开始
        // 按钮的tag是加了bastTag,通过section来找按钮需要加上baseTag
        let button = toolBar.viewWithTag(showSection+baseTag) as! UIButton
        // 3.切换对应的按钮高亮
        switchSelectedButton(button)
    }
    // collectionViewcell的点击事件, cell的点击事件会被按钮的抢走(被按钮消费了,要取消按钮交互)
    func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
        // 获取对应的表情包
        let package = packages![indexPath.section]
        // 获取对应模型
        let emoticon = package.emoticons[indexPath.row]
        //print("点击的模型: \(emoticon)")
        // 将模型的表情添加到textView里面
        //insertEmoticon(emoticon)
        textView?.insertEmoticon(emoticon)
    }
    
    
    
    
    
    
    
    
    
    
 
    
    
    /*
    /// 添加表情到textView里面
    func insertEmoticon(emoticon: LREmoticon) {
        //判断textView是否有值
        guard let textV = textView else {
            print("textView没有值")
            return
        }
        // 需要添加的表情有2种
        // 1.添加emoji表情
        if let emoji = emoticon.emoji {
            textV.insertText(emoji)
        }
        // 2.添加图片表情
        if let pngPath = emoticon.pngPath {
            //创建附件
            let attachment = NSTextAttachment()
            // 2.2给附件添加图片
            attachment.image = UIImage(contentsOfFile: pngPath)
            // 2.2.1设置图片的bounds
            let w = textV.font!.lineHeight
            //bounds往下移是负数和frame相反
            attachment.bounds = CGRect(x: 0, y: -(w*0.2), width: w, height: w)
            // 2.3将附件转成可变的属性文本
            let attrText = NSMutableAttributedString(attributedString: NSAttributedString(attachment: attachment))
            // 2.3.2发现在图片后面连续添加图片,图片会变小.原因是附件缺少Font属性,给附件添加Font属性
            attrText.addAttribute(NSFontAttributeName, value: textV.font!, range: NSRange(location: 0, length: 1))
            // 2.4获取现有的属性文本,转成可变属性文本
            let currentAttrText = NSMutableAttributedString(attributedString: textV.attributedText)
            // 2.5获取选中位置
            let selectedRange = textV.selectedRange
            // 2.6将图片替换到现有文本选中的位置
            currentAttrText.replaceCharactersInRange(selectedRange, withAttributedString: attrText)
            // 2.7将替换好的属性文本赋值给textView
            textV.attributedText = currentAttrText
            // 2.8设置光标位置
            textV.selectedRange = NSRange(location: selectedRange.location + 1, length: 0)
        }
    }
    */
}







